package com.ruoyi.common.utils.app.msg;

import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
import darabonba.core.client.ClientOverrideConfiguration;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CompletableFuture;

import static com.ruoyi.common.utils.app.msg.ConstantPropertiesUtils.ACCESS_KEY_ID;
import static com.ruoyi.common.utils.app.msg.ConstantPropertiesUtils.SECRECT;

/**
 * 短信发送工具类
 */
@Slf4j
public class SMSUtils {

    /**
     * 封装一个方法来发送短信
     *
     * @param phoneNumbers 手机号
     * @param param        参数
     */
    public static void sendMessage(String phoneNumbers, String param) {

        // 1. 设置accessKeyId和accessKeySecret
        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
                .accessKeyId(ACCESS_KEY_ID)
                .accessKeySecret(SECRECT)
                .build());

        // 2. 新建一个异步的客户端
        AsyncClient client = AsyncClient.builder()
                .region("cn-hangzhou") // Region ID
                .credentialsProvider(provider)
                // 客户端级配置重写，可以设置端点、Http请求参数等。
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("dysmsapi.aliyuncs.com")
                )
                .build();

        // 3. 使用建造者模式构建请求体对象，设置签名、电话的号码、模板、以及发送验证码的值
        SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
                .signName("阿里云短信测试")
                .templateCode("SMS_154950909")
                .phoneNumbers(phoneNumbers)
                .templateParam("{\"code\":\"" + param + "\"}")
                .build();


        // 4. 异步获取 API 请求的返回值，响应后打印日志，查看是否发送成功
        CompletableFuture<SendSmsResponse> response = client.sendSms(sendSmsRequest);
        log.info("短信发送成功！返回响应体为" + response);

        // 5. 最后，关闭客户端
        client.close();
    }
}
